package cn.itcast.web.controller.system;

import cn.itcast.service.system.RoleService;
import cn.itcast.domain.system.Role;
import cn.itcast.domain.system.Module;
import cn.itcast.service.system.DeptService;
import cn.itcast.service.system.ModuleService;
import cn.itcast.web.controller.BaseController;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * @author LT
 * @version 1.0.0
 * @ClassName RoleController.java
 * @Description TODO 角色控制层
 * @createTime 2020年03月24日 15:19:00
 */

@Controller
@RequestMapping("/system/role")
public class RoleController extends BaseController {
    @Autowired
    private DeptService deptService;

    @Autowired
    private RoleService roleService;

    @Autowired
    private ModuleService moduleService;

    /*
      展示角色列表
      url： http://localhost:8080/system/role/list.do
      参数： 无
      返回值： system/role/role-list.jsp
     */
    @RequestMapping("/list")
    public String list(@RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "5") int pageSize) {
        //1.企业id应该是当前登陆的用户所属的id，但是当前我们还没有实现的登陆功能，所以暂时把企业的id写死。
        String companyId = getLoginCompanyId();
        PageInfo<Role> pageInfo = roleService.findByPage(pageNum, pageSize, companyId);
        //2.把pageInfo存储到作用域中
        request.setAttribute("pageInfo", pageInfo);
        return "system/role/role-list";
    }


    /*
     进入添加角色的页面
      url： http://localhost:8080/system/role/toAdd.do
      参数： 无
      返回值： system/role/role-add.jsp
     */
    @RequestMapping("/toAdd")
    public String toAdd() {
        //1. 查询所有的角色，用于展示父角色的下拉框
        String companyId = getLoginCompanyId();
        List<Role> roleList = roleService.findAll(companyId);
        //2. 存储到域中
        request.setAttribute("roleList", roleList);
        return "system/role/role-add";
    }


    /*
     保存添加角色信息|| 修改角色信息
      url： http://localhost:8080/system/role/edit.do
      参数： role
      返回值： list.do 进入列表页面
     */
    @RequestMapping("/edit")
    public String edit(Role role) {
        if (StringUtils.isEmpty(role.getId())) {
            //补充角色所属的公司信息,目前暂时写死
            String companyId = getLoginCompanyId();
            String companyName = getLoginCompanyName();
            role.setCompanyId(companyId);
            role.setCompanyName(companyName);
            //添加
            roleService.save(role);

        } else {
            //修改
            roleService.update(role);
        }
        return "redirect:/system/role/list.do";
    }


    /*
   进入角色的修改页面
    url： http://localhost:8080/system/role/toUpdate.do
    参数： id  角色的id
    返回值： system/role/role-update
   */
    @RequestMapping("/toUpdate")
    public String toUpdate(String id) {
        //1.数据回显，要id查找一个角色
        Role role = roleService.findById(id);
        //2. 查询所有的角色信息出来
        String companyId = getLoginCompanyId();
        List<Role> roleList = roleService.findAll(companyId);
        //3. 存储到域中
        request.setAttribute("role", role);
        request.setAttribute("roleList", roleList);
        return "system/role/role-update";
    }


    /*
    删除角色
     url： http://localhost:8080/system/role/delete.do
     参数： id  角色的id
     返回值：json对象
    */
    @RequestMapping("/delete")
    public String delete(String id) {
        roleService.delete(id);
        return "redirect:/system/role/list.do";
    }


    /**
     * 作用：进入角色分配权限的页面
     * url: /system/role/roleModule.do?roleid=4028a1c34ec2e5c8014ec2ebf8430001
     *
     * @param roleid
     * @return system/role/role-module.jsp
     */
    @RequestMapping("roleModule")
    public String roleModule(String roleid) {
        //根据当前角色id查询出当前角色对象即可
        Role role = roleService.findById(roleid);
        request.setAttribute("role",role);
        return "system/role/role-module";
    }


    /**
     * 方法的作用：给页面返回符合ztree要求的json格式的数据。
     * url: /system/role/getTreeNodes.do
     *
     * @param roleId 角色的id
     * @return json对象
     * json格式：
     * [
     * { id:1, pId:0, name:"Saas管理", open:true},
     * { id:11, pId:1, name:"企业管理", open:true},
     * { id:111, pId:1, name:"模块管理",open:true},
     * ]
     */
    @RequestMapping("getTreeNodes")
    @ResponseBody
    public List<Map<String, Object>> getTreeNodes(String roleId) {
        //定义一个集合用于存储结果
        List<Map<String,Object>> resultList = new ArrayList<>();

        //1. 查询所有的模块出来
        List<Module> moduleList = moduleService.findAll();

        //2. 查询当前角色已经拥有权限
        List<Module> roleModuleList = moduleService.findRoleModuleByRoleId(roleId);


        // 遍历模块，把模块信息添加到Map中
        for (Module module : moduleList) {
            Map<String,Object> map = new HashMap<>();
            map.put("id",module.getId());
            map.put("pId",module.getParentId());
            map.put("name",module.getName());
            map.put("open",true);
            //使用contains的底层就是相当于上面的代码，注意：比较规则是依赖Module的equals.
            if(roleModuleList.contains(module)){
                map.put("checked",true);
            }

            /*   map.put("checked",true);*/

            //每遍历一个模块的时候，我都判断一下当前的这个模块，该角色是否拥有。
           /* for (Module roleModuleItem : roleModuleList) {
                if(roleModuleItem.getId().equals(module.getId())){
                    //该角色拥有当前的模块
                    map.put("checked",true);
                }
            }*/

            //3. 再map存储到list中，然后返回即可。
            resultList.add(map);
        }
        return resultList;
    }



    /**
     * 方法的作用：更新保存角色拥有权限
     * url: /system/role/updateRoleModule.do
     * @param roleid 角色的id
     * @param moduleIds 模块id字符串
     * @return 角色列表
     */
    @RequestMapping("updateRoleModule")
    public String updateRoleModule(String roleid, String moduleIds) {
        roleService.updateRoleModule(roleid, moduleIds);
        return "redirect:/system/role/list.do";
    }
}
